package zhang_wei_huan;
/*
*
* 链表实现栈的入栈、出栈、获取栈的长度和获取栈顶元素
*
* */

public class ZHANG_WEI_HUAN_23_Q1<V> {


        private int length;//定义长度
        private Node<V> top;
        class Node<V>{
            V v;
            Node<V> next;
            public Node(V v, Node<V> next) {////定义头 尾
                this.v = v;
                this.next = next;
            }
        }
        //实现构造器初始化
        public ZHANG_WEI_HUAN_23_Q1() {
            this.length =0;
            this.top=null;
        }
        //入栈
        public void push(V v) {
            if (v == null) {//判断入栈是否为空
                throw new NullPointerException("放入元素不能为null");//抛出空指针异常
            }else if(this.length>=100){
                System.out.println("大于100个元素，栈满了");
                return;
            }
            Node newNode = new Node(v, null);
            //获取栈的长度
            if(length==0){//当长度等于0时，当前的入栈个数等于新的入栈数，否则等于下一个的入栈数
                this.top=newNode;
            }else{
                newNode.next=this.top.next;
            }
            this.top.next=newNode;
            this.length++;//长度++
        }
        //出栈
        public V pop(){
            if(length==0){//判断出栈的长度
                throw new NullPointerException("栈为空");
            }else{//与上述同理
                V v=this.top.next.v;
                this.top=this.top.next;
                length--;
                return v;
            }
        }
        //获取栈顶元素
        public V getTop(){
            if(length==0){
                throw new NullPointerException("栈为空");//若是长度等于0 则抛出异常
            }
            return this.top.next.v;//否则返回当前数的下一个
        }
        //获取长度
        public int getLength(){
            return length;
        }
        public static void main(String[] args) {
            ZHANG_WEI_HUAN_23_Q1 TH_Q1 =new ZHANG_WEI_HUAN_23_Q1();
            int length=5;
            for(int i=0;i<length;i++){
                TH_Q1.push(i+1);
            }
            System.out.println("栈长为 "+TH_Q1.getLength());
            System.out.println("栈顶元素为 "+TH_Q1.getTop());
            System.out.println("开始出栈");
            for(int i=0;i<length;i++){
                System.out.println("第"+(i+1)+"个元素的值为 "+TH_Q1.pop());
            }
            System.out.println("栈长为 "+TH_Q1.getLength());
            System.out.println("此时栈空查询栈顶元素抛出异常");
            System.out.println(TH_Q1.getTop());
        }



}
